#pragma once

#include <stdint.h>

static inline uint32_t make_checksum_32(uint8_t *pdata, uint32_t dataLen) {
  uint32_t chk = 0, len = dataLen;

  // 按照小端的方式计算4个字节的checksum
  while (len >= 4) {
    chk += (uint32_t)pdata[0];         //     ----          ----         ----       pdata[0]
    chk += ((uint32_t)pdata[1] << 8);  //     ----          ----        pdata[1]     ----
    chk += ((uint32_t)pdata[2] << 16); //     ----         pdata[2]      ----        ----
    chk += ((uint32_t)pdata[3] << 24); //     pdata[3]      ----         ----        ----

    pdata += 4;
    len -= 4;
  }

  if (len > 0) {
    if (len == 1) {
      chk += (uint32_t)pdata[0];
    } else if (len == 2) {
      chk += (uint32_t)pdata[0];
      chk += ((uint32_t)pdata[1] << 8);
    } else {
      chk += (uint32_t)pdata[0];
      chk += ((uint32_t)pdata[1] << 8);
      chk += ((uint32_t)pdata[2] << 16);
    }
  }

  chk = ~chk;
  chk++;

  return chk;
}